package com.yueke.gemini.aspect;
import java.lang.reflect.Method;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;


/**
 * 实现Web层的日志切面
 * @author qxw
 * 2018年3月28日
 */

@Aspect
@Component
public class WebLogAspect {

	/**
	 *  使用@Aspect注解将一个java类定义为切面类
		使用@Pointcut定义一个切入点，可以是一个规则表达式，比如下例中某个package下的所有函数，也可以是一个注解等。
		根据需要在切入点不同位置的切入内容
		使用@Before在切入点开始处切入内容
		使用@After在切入点结尾处切入内容
		使用@AfterReturning在切入点return内容之后切入内容（可以用来对处理返回值做一些加工处理）
		使用@Around在切入点前后切入内容，并自己控制何时执行切入点自身的内容
		使用@AfterThrowing用来处理当切入内容部分抛出异常之后的处理逻辑
	 */
	  private Logger logger = LoggerFactory.getLogger(getClass());
	 
	 
	   @Pointcut("execution(public * com.yueke.gemini.modules..*.*(..))")
	    public void webLog(){}

	    @Before("webLog()")
	    public void doBefore(JoinPoint joinPoint) throws Throwable {
//	    	System.out.println("===================================webLog--------------------------------------");
	        // 接收到请求，记录请求内容
	    	  MethodSignature signature = (MethodSignature) joinPoint.getSignature();
	          Method method = signature.getMethod();
	          //请求的方法名
	          String className = joinPoint.getTarget().getClass().getName();
	          String methodName = signature.getName();
	          //请求的参数
	          Object[] args = joinPoint.getArgs();     
	        
	    }

	    @AfterReturning(returning = "ret", pointcut = "webLog()")
	    public void doAfterReturning(Object ret) throws Throwable {
	    				
	    }
}
